from __future__ import print_function, unicode_literals

import json

from wee_slack import SlackTS


def test_process_message(realish_eventrouter, team, user_alice):
    messages = []
    messages.append(
        json.loads(
            open("_pytest/data/websocket/1485975421.33-message.json", "r").read()
        )
    )

    # test message and then change
    messages.append(
        json.loads(open("_pytest/data/websocket/1485976151.6-message.json", "r").read())
    )
    messages.append(
        json.loads(
            open("_pytest/data/websocket/1485976157.18-message.json", "r").read()
        )
    )

    # test message then deletion
    messages.append(
        json.loads(
            open("_pytest/data/websocket/1485975698.45-message.json", "r").read()
        )
    )
    messages.append(
        json.loads(
            open("_pytest/data/websocket/1485975723.85-message.json", "r").read()
        )
    )

    for m in messages:
        m["user"] = user_alice.id
        team.ws.add(m)

    realish_eventrouter.receive_ws_callback(team.team_hash, None)
    realish_eventrouter.handle_next()
    realish_eventrouter.handle_next()
    realish_eventrouter.handle_next()
    realish_eventrouter.handle_next()
    realish_eventrouter.handle_next()

    assert sum([len(channel.messages) for channel in team.channels.values()]) == 3

    unchanged_message_channel = team.channels["D3ZEQULHZ"]
    unchanged_message_ts = SlackTS("1485975421.000002")
    assert list(unchanged_message_channel.messages.keys()) == [unchanged_message_ts]
    assert (
        unchanged_message_channel.messages[unchanged_message_ts].message_json["text"]
        == "hi bob"
    )
    assert (
        "edited"
        not in unchanged_message_channel.messages[unchanged_message_ts].message_json
    )

    changed_message_channel = team.channels["C407ABS94"]
    changed_message_ts = SlackTS("1485976151.000016")
    assert list(changed_message_channel.messages.keys()) == [changed_message_ts]
    assert (
        changed_message_channel.messages[changed_message_ts].message_json["text"]
        == "referencing a <#C407ABS94|general>"
    )
    assert "edited" in changed_message_channel.messages[changed_message_ts].message_json

    deleted_message_channel = team.channels["G3ZGMF4RZ"]
    deleted_message_ts = SlackTS("1485975698.000002")
    assert list(deleted_message_channel.messages.keys()) == [deleted_message_ts]
    deleted_str = "<[color red]>(deleted)<[color reset]>"
    assert (
        deleted_message_channel.messages[deleted_message_ts].message_json[
            "_rendered_text"
        ]
        == deleted_str
    )
